<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns="http://www.w3.org/1999/xhtml">

<xsl:output
	method="xml"
	indent="yes"
	encoding="UTF-8"
	omit-xml-declaration="yes"/>


<xsl:include href="template-game.xsl"/>


<xsl:template name="navigation-structure">
	<nav role="navigation">
		<ul>
			<xsl:for-each select="$names/structures/structure">
				<li>
					<a href="?page=structure&amp;structure={@id}"><xsl:value-of select="text()"/></a>
				</li>
			</xsl:for-each>
		</ul>
	</nav>
</xsl:template>


<!--TODO fichier à part-->
<xsl:template name="info-player">
	<xsl:variable name="id-race" select="$player-session/@race"/>

	<section id="info-player">
		<ul>
			<li>Joueur : <xsl:value-of select="$player-session"/> (<xsl:value-of select="$id-player-session"/>)</li>
			<li>Race : <xsl:value-of select="$names/races/race[@id=$id-race]"/> (<xsl:value-of select="$id-race"/>)</li>
			<li>Planète sélectionner : (<xsl:value-of select="$id-planet-current-session"/>)  <xsl:apply-templates select="$planet-current-session"/></li>
		</ul>
	</section>
</xsl:template>

<!-- Crée un bouton d'action
add-level = 'yes'|int : si yes alors c'est un input[type=number] sinon nu input[type=hidden]-->
<xsl:template name="structure-action">
	<xsl:param name="action"/>
	<xsl:param name="type"/>
	<xsl:param name="element"/>
	<xsl:param name="id-planet"/>

	<!--pas besoin de mettre la requête car l'action va la modifier
	<xsl:variable name="request"><xsl:call-template name="str-request-keep"/></xsl:variable>
	<form method="post" action="{$page}{$request}" class="action {$action} {$type}">-->
	<form method="post" action="{$page}" class="action {$action} {$type}">
		<xsl:call-template name="hidden-request-keep"/>
		<input type="hidden" name="action" value="{$action}" />
		<input type="hidden" name="structure" value="{$type}" />
		<input type="hidden" name="id" value="{$element/@id}" />
		<input type="hidden" name="planet" value="{$id-planet}" />
		<xsl:if test="$action = 'build'">
			<xsl:choose>
				<xsl:when test="$type = 'building'">
					<input type="hidden" name="add-level" value="1" />
				</xsl:when>
				<xsl:otherwise>
					<input type="number" name="add-level" value="1" min="1" /><xsl:if test="$type = 'research'">/h </xsl:if>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:if>

		<input type="submit">
			<xsl:attribute name="value">
				<xsl:choose>
					<xsl:when test="$action = 'down'">Arrêter</xsl:when>
					<xsl:when test="$action = 'build'">
						<xsl:choose>
							<xsl:when test="$type = 'research'">Évoluer</xsl:when>
							<xsl:when test="$type = 'army'">Construire</xsl:when>
							<xsl:otherwise>Construire le niveau <xsl:value-of select="$element/@level + 1"/></xsl:otherwise>
						</xsl:choose>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="$type"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:attribute>
		</input>
	</form>
</xsl:template>


<!-- Affiche le nom-->
<xsl:template name="name-element">
	<xsl:param name="names"/>
	<xsl:param name="group"/>

	<span class="name"><xsl:value-of select="$names[@id=$group]"/></span>
</xsl:template>


<!-- le niveau et le pourcentage de la structure et si names et group alors en plus fait name-element -->
<xsl:template name="information-element">
	<xsl:param name="element"/>
	<xsl:param name="names"/>
	<xsl:param name="group"/>
	<xsl:param name="type"/>

	<xsl:if test="boolean($names) and (boolean($group) or $group = 0)">
		<xsl:call-template name="name-element">
			<xsl:with-param name="names" select="$names"/>
			<xsl:with-param name="group" select="$group"/>
		</xsl:call-template>
	</xsl:if>

	<xsl:text> </xsl:text>
	<xsl:choose>
		<xsl:when test="$type = 'research'">
			<xsl:choose>
				<xsl:when test="$element/@percentage">
					niveau <span class="level"><xsl:value-of select="$element/@level"/> (+<span class="gain"><xsl:value-of select="$element/@percentage"/>%</span>)</span>
				</xsl:when>
				<!-- si le recherche ne poccède pas l'attribut level alors il est remplacé par hour-->
				<xsl:when test="$element/@level">
					<span class="gain">+<xsl:value-of select="$element/@level"/>%</span>
				</xsl:when>
				<xsl:otherwise>
					<span class="duration">+<xsl:value-of select="$element/@hour"/>h</span>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:when>
		<xsl:otherwise>
			<xsl:if test="$type != 'army'">niveau</xsl:if>
			<xsl:text> </xsl:text>
			<span class="level"><xsl:value-of select="$element/@level"/></span>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>


<xsl:template name="structure-duration-terminated">
	<xsl:param name="duration"/>

	<span>terminé dans <xsl:call-template name="duration-format">
		<xsl:with-param name="duration" select="$duration"/>
	</xsl:call-template></span>
</xsl:template>


<xsl:template name="menu-elements">
	<xsl:param name="elements"/>
	<xsl:param name="names"/>

	<xsl:variable name="type" select="$elements/../../@type"/>
	<ul>
		<xsl:for-each select="$elements">
			<xsl:if test="boolean(element)">
				<li>
					<xsl:choose>
						<xsl:when test="count(element) > 1">
							<ul>
								<span>
									<xsl:call-template name="name-element">
										<xsl:with-param name="names" select="$names"/>
										<xsl:with-param name="group" select="@group"/>
									</xsl:call-template>
								</span>

								<xsl:variable name="group" select="@group"/>
								<xsl:for-each select="element">
									<li>
										<a>
											<xsl:attribute name="href">
												<xsl:choose>
													<xsl:when test="@id">
														#structure-<xsl:value-of select="$type"/>-<xsl:value-of select="@id"/>
													</xsl:when>
													<xsl:otherwise>
														#structure-<xsl:value-of select="$type"/>-group-<xsl:value-of select="$group"/>
													</xsl:otherwise>
												</xsl:choose>
											</xsl:attribute>
											<xsl:call-template name="information-element">
												<xsl:with-param name="element" select="."/>
												<xsl:with-param name="type" select="$type"/>
											</xsl:call-template>
										</a>
									</li>
								</xsl:for-each>
							</ul>
						</xsl:when>
						<xsl:otherwise>
							<a>
								<xsl:attribute name="href">
									<xsl:choose>
										<xsl:when test="element/@id">
											#structure-<xsl:value-of select="$type"/>-<xsl:value-of select="element/@id"/>
										</xsl:when>
										<xsl:otherwise>
											#structure-<xsl:value-of select="$type"/>-group-<xsl:value-of select="@group"/>
										</xsl:otherwise>
									</xsl:choose>
								</xsl:attribute>
								<xsl:call-template name="information-element">
									<xsl:with-param name="element" select="element"/>
									<xsl:with-param name="names" select="$names"/>
									<xsl:with-param name="group" select="@group"/>
									<xsl:with-param name="type" select="$type"/>
								</xsl:call-template>
							</a>
						</xsl:otherwise>
					</xsl:choose>
				</li>
			</xsl:if>
		</xsl:for-each>
	</ul>
</xsl:template>


<xsl:template name="informations-structure">
	<xsl:param name="structure"/>
	<xsl:param name="names"/>
	<xsl:param name="hn"/>

	<xsl:variable name="informations-elements" select="$structure/informations/element"/>

	<xsl:if test="count($informations-elements)">
		<xsl:call-template name="render-type">
			<xsl:with-param name="names" select="$names"/>
			<xsl:with-param name="type" select="$structure/@type"/>
			<xsl:with-param name="hn" select="$hn"/>
		</xsl:call-template>

		<section class="message-box information">
			<xsl:variable name="h">
				<xsl:choose>
					<xsl:when test="number($hn) > 0">h<xsl:value-of select="number($hn)+1"/></xsl:when>
					<xsl:otherwise>h2</xsl:otherwise>
				</xsl:choose>
			</xsl:variable>

			<xsl:element name="{$h}">Information</xsl:element>

			<xsl:variable name="type" select="$structure/@type"/>
			<xsl:variable name="names-element" select="$names/elements/elements[@id=$type]/element"/>

			<xsl:for-each select="$informations-elements">
				<p>
					<span>
						<xsl:if test="boolean(@error)">
							<xsl:attribute name="class">error</xsl:attribute>
						</xsl:if>

						<xsl:variable name="id" select="@id"/>
						<xsl:call-template name="information-element">
							<xsl:with-param name="element" select="."/>
							<xsl:with-param name="names" select="$names-element"/>
							<xsl:with-param name="group" select="$structure/elements/elements/element[@id=$id]/../@group"/>
							<xsl:with-param name="type" select="$type"/>
						</xsl:call-template>

						<span class="action">
							<xsl:choose>
								<xsl:when test="boolean(@error)">
									: <xsl:choose>
										<xsl:when test="boolean(text())"><xsl:value-of select="."/></xsl:when>
										<xsl:when test="@action = 'build'">impossible de construire</xsl:when>
										<xsl:when test="@action = 'down'">impossible d'arrêté</xsl:when>
										<xsl:when test="@action = 'finish'">impossible de terminé</xsl:when>
										<xsl:otherwise> : <xsl:value-of select="@action"/></xsl:otherwise>
									</xsl:choose>
								</xsl:when>
								<xsl:when test="@action = 'finish'"> terminé</xsl:when>
								<xsl:when test="@action = 'down'"> arrêté</xsl:when>
								<xsl:when test="@action = 'build'"> se construit</xsl:when>
								<xsl:otherwise> : <xsl:value-of select="@action"/></xsl:otherwise>
							</xsl:choose>
						</span>
					</span>
				</p>
			</xsl:for-each>
		</section>
	</xsl:if>
</xsl:template>


<xsl:template name="render-type">
	<xsl:param name="names"/>
	<xsl:param name="type"/>
	<xsl:param name="hn"/>

	<xsl:variable name="n">
		<xsl:choose>
			<xsl:when test="number($hn) > 0"><xsl:value-of select="number($hn)"/></xsl:when>
			<xsl:otherwise>1</xsl:otherwise>
		</xsl:choose>
	</xsl:variable>

	<xsl:element name="h{$n}">
		<xsl:attribute name="class">type</xsl:attribute>
		<span>
			<xsl:variable name="name" select="$names/structures/structure[@id=$type]"/>
			<xsl:choose>
				<xsl:when test="$name"><xsl:value-of select="$name"/></xsl:when>
				<xsl:otherwise><xsl:value-of select="$names[@id=$type]"/></xsl:otherwise>
			</xsl:choose>
		</span>
	</xsl:element>
</xsl:template>


<xsl:template name="informations-waiting-list">
	<xsl:param name="structure"/>
	<xsl:param name="names"/>
	<xsl:param name="action"/>

	<xsl:if test="boolean($structure/waiting-list/element)">
		<section class="message-box waiting-list">
			<h2>Liste de construction</h2>

			<xsl:variable name="type" select="$structure/@type"/>
			<xsl:variable name="names-element" select="$names/elements/elements[@id=$type]/element"/>
			<xsl:variable name="id-planet" select="$structure/../@id-planet"/>

			<xsl:for-each select="$structure/waiting-list/element">
				<xsl:variable name="ref" select="@ref"/>
				<p>
					<span>
						<xsl:call-template name="information-element">
							<xsl:with-param name="element" select="."/>
							<xsl:with-param name="names" select="$names-element"/>
							<xsl:with-param name="group" select="$structure/elements/elements/element[@id=$ref]/../@group"/>
							<xsl:with-param name="type" select="$type"/>
						</xsl:call-template>
						<xsl:text> </xsl:text> <!-- sinon pas d'espace… -->
						<xsl:call-template name="structure-duration-terminated">
							<xsl:with-param name="duration" select="@duration"/>
						</xsl:call-template>
						<xsl:if test="$type != 'research'">
							<xsl:call-template name="structure-action">
								<xsl:with-param name="action" select="'down'"/>
								<xsl:with-param name="type" select="$type"/>
								<xsl:with-param name="element" select="."/>
								<xsl:with-param name="id-planet" select="$id-planet"/>
							</xsl:call-template>
						</xsl:if>
					</span>
				</p>
			</xsl:for-each>
		</section>
	</xsl:if>
</xsl:template>


<xsl:template match="structure">
	<section class="structure {@type}">
		<xsl:call-template name="informations-structure">
			<xsl:with-param name="structure" select="."/>
			<xsl:with-param name="names" select="$names"/>
		</xsl:call-template>

		<xsl:call-template name="informations-waiting-list">
			<xsl:with-param name="structure" select="."/>
			<xsl:with-param name="names" select="$names"/>
			<xsl:with-param name="action" select="'down'"/>
		</xsl:call-template>

		<xsl:if test="boolean(elements/elements)">
			<xsl:variable name="type" select="@type"/>
			<xsl:variable name="names-element" select="$names/elements/elements[@id=$type]/element"/>

			<section class="available">
				<h2>Disponible</h2>

				<nav>
					<xsl:call-template name="menu-elements">
						<xsl:with-param name="elements" select="elements/elements"/>
						<xsl:with-param name="names" select="$names-element"/>
					</xsl:call-template>
				</nav>

				<xsl:variable name="id-planet" select="../@id-planet"/>
				<xsl:variable name="waiting-element" select="waiting-list/element"/>
				<xsl:variable name="resources-element" select="/sun-wars/resources/resources[@id-planet=$id-planet]/resource"/>
				<xsl:variable name="names-resource" select="$names/resources/resource"/>
				<xsl:variable name="can-build" select="elements/@can-build != 'no'"/>

				<!-- TODO il faudrait rassembler les éléments du même groupe (v > 1 : affichage relativement différent)-->
				<xsl:for-each select="elements/elements">
					<xsl:variable name="group" select="@group"/>
					<xsl:for-each select="element">
						<article class="element">
							<h3 id="structure-{$type}-{@id}">
								<xsl:call-template name="information-element">
									<xsl:with-param name="element" select="."/>
									<xsl:with-param name="names" select="$names-element"/>
									<xsl:with-param name="group" select="$group"/>
									<xsl:with-param name="type" select="$type"/>
								</xsl:call-template>
							</h3>

	<!-- 						TODO description dans un fichier -->
							<div role="description">
							</div>

							<!--chaîne à 0 pour un manque de ressource ou à 1. Le caractère correspond à la position du nœud ressource de l'élément-->
							<xsl:variable name="str-resource-sufficient">
								<xsl:for-each select="cost/resource">
									<xsl:variable name="group-resource" select="@group"/>
									<xsl:choose>
										<xsl:when test="number(.) > sum($resources-element[@group=$group-resource]/quantity)">0</xsl:when>
										<xsl:otherwise>1</xsl:otherwise>
									</xsl:choose>
								</xsl:for-each>
							</xsl:variable>

							<table class="cost">
								<caption>Prix</caption>

								<thead>
									<tr>
										<xsl:for-each select="cost/resource">
											<xsl:variable name="group-resource" select="@group"/>
											<th>
												<xsl:if test="substring($str-resource-sufficient, position(), 1) = '0'">
													<xsl:attribute name="class">insufficient</xsl:attribute>
												</xsl:if>
												<xsl:value-of select="$names-resource[@id=$group-resource]"/>
											</th>
										</xsl:for-each>
										<xsl:if test="$type = 'research'">
											<th>pourcentage (%)</th>
										</xsl:if>
									</tr>
								</thead>
								<tbody>
									<tr>
										<xsl:for-each select="cost/resource">
											<td>
												<xsl:if test="substring($str-resource-sufficient, position(), 1) = '0'">
													<xsl:attribute name="class">insufficient</xsl:attribute>
												</xsl:if>
												<xsl:value-of select="text()"/>
											</td>
										</xsl:for-each>
										<xsl:if test="$type = 'research'">
											<td><xsl:value-of select="percentage"/></td>
										</xsl:if>
									</tr>
								</tbody>
							</table>

							<xsl:if test="$type != 'research'">
								<p class="information">
									durée de construction : <xsl:call-template name="duration-format">
										<xsl:with-param name="duration" select="duration"/>
									</xsl:call-template>
								</p>
							</xsl:if>

<!-- TODO Ceci pourrait être dans des template de type structure[@type='building|research|army']. Ou une template du nom action-element avec des comme mode le nom du type de structure. Ou encore un fichier de conf pour l'affichage. -->
							<div class="action">
								<xsl:choose>
									<xsl:when test="$can-build">
										<xsl:choose>
											<!-- ressource insuffisante -->
											<xsl:when test="contains($str-resource-sufficient, '0')">
												<form class="action"><input type="button" disabled="disabled" value="Il manque des ressources" /></form>
											</xsl:when>
											<!-- on peut construire-->
											<xsl:otherwise>
												<xsl:call-template name="structure-action">
													<xsl:with-param name="action" select="'build'"/>
													<xsl:with-param name="type" select="$type"/>
													<xsl:with-param name="element" select="."/>
													<xsl:with-param name="id-planet" select="$id-planet"/>
												</xsl:call-template>
											</xsl:otherwise>
										</xsl:choose>
									</xsl:when>
									<xsl:when test="$type != 'army'">
										<xsl:variable name="id" select="@id"/>
										<xsl:variable name="list" select="$waiting-element[@ref=$id]"/>
										<xsl:choose>
											<!-- en construction-->
											<xsl:when test="$list">
												<p class="information">
													<xsl:call-template name="structure-duration-terminated">
														<xsl:with-param name="duration" select="$list/@duration"/>
													</xsl:call-template>
												</p>
												<xsl:if test="$type = 'building'">
													<xsl:call-template name="structure-action">
														<xsl:with-param name="action" select="'down'"/>
														<xsl:with-param name="type" select="$type"/>
														<xsl:with-param name="element" select="$waiting-element"/>
														<xsl:with-param name="id-planet" select="$id-planet"/>
													</xsl:call-template>
												</xsl:if>
											</xsl:when>
											<xsl:otherwise>
												<form class="action"><input type="button" disabled="disabled" value="Impossible de construire" /></form>
											</xsl:otherwise>
										</xsl:choose>
									</xsl:when>
									<xsl:otherwise>
										<form class="action"><input type="button" disabled="disabled" value="Impossible de construire" /></form>
									</xsl:otherwise>
								</xsl:choose>
							</div>
						</article>
					</xsl:for-each>
				</xsl:for-each>
			</section>
		</xsl:if>
	</section>
</xsl:template>


<xsl:template name="content" mode="structure">
	<xsl:call-template name="navigation-structure"/>
	<xsl:call-template name="info-player"/>

	<xsl:if test="count(/sun-wars/structures/structures[@id-planet!=$id-planet-current-session]/structure/informations/element)">
		<section class="message-box information">
			<xsl:for-each select="/sun-wars/structures/structures[@id-planet!=$id-planet-current-session]">
				<xsl:if test="/structure/informations/element">
					<article>
						<h1>Planète
							<xsl:call-template name="apply-planet">
								<xsl:with-param name="id" select="@id-planet"/>
							</xsl:call-template>
						</h1>
						<div>
							<xsl:for-each select="structure">
								<xsl:call-template name="informations-structure">
									<xsl:with-param name="structure" select="."/>
									<xsl:with-param name="names" select="$names"/>
									<xsl:with-param name="hn" select="2"/>
								</xsl:call-template>
							</xsl:for-each>
						</div>
					</article>
				</xsl:if>
			</xsl:for-each>
		</section>
	</xsl:if>

	<xsl:apply-templates select="/sun-wars/structures/structures[@id-planet=$id-planet-current-session]/structure"/>
</xsl:template>


</xsl:stylesheet>